package org.abadirou.cdebacker.flst;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.Query;

import org.abadirou.cdebacker.flst.api.Chambre;
import org.abadirou.cdebacker.flst.api.TypeChambre;
import org.abadirou.cdebacker.flst.api.dao.ChambreDao;
import org.abadirou.cdebacker.flst.api.dao.TypeChambreDao;
import org.abadirou.cdebacker.flst.entity.ChambreImpl;

import com.google.inject.Inject;
import com.google.inject.Singleton;

@SuppressWarnings("unchecked")
@Singleton
public class JPAChambreDao implements ChambreDao {

	@Inject
	private EntityManager em;

	@Inject
	TypeChambreDao tcDAO;

	@Override
	public void saveEntry(Chambre chambre) {
		EntityTransaction tx = em.getTransaction();

		tx.begin();
		em.persist(chambre);
		tx.commit();
	}

	@Override
	public Chambre getChambre(Long id) {
		return em.find(ChambreImpl.class, id);
	}

	@Override
	public Chambre createChambre(int numero, TypeChambre type) {
		return new ChambreImpl(numero, tcDAO.get(type.getId()));
	}

	@Override
	public List<Chambre> getChambres() {
		return em.createNamedQuery(ChambreImpl.ALL_CHAMBRE).getResultList();
	}

	@Override
	public Chambre getChambreByNumero(int numero) {
		Query query = em.createNamedQuery(ChambreImpl.CHAMBRE_BY_NUMERO);

		return (Chambre) query.setParameter("numero", numero).getSingleResult();
	}

	@Override
	public List<Chambre> getChambreByEtage(int etage) {
		Query query = em.createNamedQuery(ChambreImpl.CHAMBRE_BY_ETAGE);
		return query.setParameter("etage", etage).getResultList();
	}

	@Override
	public List<Chambre> getChambreByType(TypeChambre typeChambre) {
		Query query = em.createNamedQuery(ChambreImpl.CHAMBRE_BY_TYPE);
		return query.setParameter("type", typeChambre).getResultList();
	}

	@Override
	public ChambreImpl get(Long id) {
		return em.find(ChambreImpl.class, id);
	}

	public int getPrice(Chambre chambre) {
		int price = 0;

		if (chambre.getType().getType().equals("simple")) {
			price += 100;
		} else if (chambre.getType().getType().equals("double")) {
			price += 200;
		}

		for (int i = 0; i < chambre.getOptions().size(); i++) {
			price += 50;
		}

		return price;
	}

}
